home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1997 January & February / Amiga-CD 1997 #1-2.iso / patches / stormamiga_lib / spezialbeispiele / pi / pi-stormamiga.c < prev   
C/C++ Source or Header  |  1996-10-27  |  3KB  |  163 lines

  1. /*
  2.  
  3. Programm für den Tröpfel-Algorithmus von PI
  4.  
  5. Algorithmus aus: Spektrum der Wissenschaft 12/1995, Mathematische Unterhaltungen
  6.  
  7. Originalversion von: Martin Knapmeyer, 03.01.1996
  8.  
  9. Umsetzung nach StormC: HAAGE & PARTNER GmbH, 16.02.1996
  10.  
  11. Mit 32 bit Integers kann man auch sehr viele Dezimalen berechnen, mit 16 bit
  12. Integers wäre 10000 Dezimalen etwa die Grenze.
  13.  
  14. Allerdings hat der Algorithmus quadratische Ordnung: doppelte Anzahl Stellen,
  15. vierfache Zeit. Schon 10000 Stellen brauchen auf einem A3000 etwa 2 Stunden.
  16.  
  17. */
  18.  
  19. #include <stdlib.h>
  20.  
  21. #ifdef __STORM__
  22.     #include <stormamiga.h>
  23.     #define printf printf_
  24.     #define scanf scanf_
  25.     #define main main__
  26. #else
  27. #include <stdio.h>
  28. #include <time.h>
  29. #endif
  30.  
  31.  
  32. int n; // Anzahl der Nachkommastellen
  33. int klen;
  34.  
  35. int *result; // Zeiger auf ein Feld mit n int
  36. int *chain;  // Zeiger auf ein Feld mit klen == 10 * n / 3 int
  37. int *temp;   // Zeiger auf ein Feld mit n int
  38.  
  39. #ifndef NDEBUG
  40. void write_chain(void)
  41. {
  42.     int i;
  43.     for (i = 0; i < klen; i++)
  44.         printf("%ld ",chain[i]);
  45.     printf("\n");
  46. }
  47. #endif
  48.  
  49. void write_result(void)
  50. {
  51.     int i;
  52.     printf("PI:\n");
  53.     for (i = 1; i < n; i++)
  54.     {
  55.         printf("%ld",result[i]);
  56.         if (i % 50 == 0)
  57.             printf("\n");
  58.     };
  59.     printf("\n");
  60. }
  61.  
  62. void init_chain(void)
  63. {
  64.     int i;
  65.     for (i = 0; i < klen; i++)
  66.         chain[i] = 2;
  67. }
  68.  
  69. void drop(void)
  70. {
  71.     int vcnt = 0, ecnt = 0;
  72.     int i,j;
  73.     div_t qr;
  74.     for (i = 0; i < n; i++)
  75.     {
  76.         for (j = 0; j < klen; j++)
  77.             chain[j] *= 10;
  78.         for (j = klen - 1; j >= 1; j--)
  79.         {
  80.             qr = div(chain[j],(2*j + 1));
  81.             chain[j] = qr.rem;
  82.             chain[j - 1] += qr.quot*j;
  83.         };
  84.         qr = div(chain[0],10);
  85.         chain[0] = qr.rem;
  86.         if (qr.quot != 9 && qr.quot != 10)
  87.         {
  88.             for (j = 0; j <= vcnt; j++)
  89.             {
  90.                 #ifndef NDEBUG
  91.                     printf("%ld. Stelle: %ld\n",ecnt-1,temp[j]);
  92.                 #endif
  93.                 result[ecnt] = temp[j];
  94.                 ecnt++;
  95.                 temp[j] = 0;
  96.             };
  97.             vcnt = 0;
  98.             temp[vcnt] = qr.quot;
  99.         }
  100.         else
  101.         {
  102.             if (qr.quot == 9)
  103.             {
  104.                 vcnt++;
  105.                 temp[vcnt] = qr.quot;
  106.             }
  107.             else // if (qr.quot == 10)
  108.             {
  109.                 qr.quot = 1;
  110.                 for (j = vcnt; j >= 0; j--)
  111.                 {
  112.                     temp[j] += qr.quot;
  113.                     qr = div(temp[j],10);
  114.                     temp[j] = qr.rem;
  115.                 };
  116.                 for (j = 0; j <= vcnt; j++)
  117.                 {
  118.                     #ifndef NDEBUG
  119.                         printf("%ld. Stelle: %ld\n",ecnt-1,temp[j]);
  120.                     #endif
  121.                     result[ecnt] = temp[j];
  122.                     ecnt++;
  123.                     temp[j] = 0;
  124.                 };
  125.                 vcnt = 0;
  126.                 temp[0] = 0;
  127.             }
  128.         };
  129.     };
  130. }
  131.  
  132. void main(void)
  133. {
  134.     clock_t timestart,timeend;
  135.     printf("Berechnung von PI\n");
  136.     for (;;)
  137.     {
  138.         printf("Stellenanzahl (0 für Ende):"); fflush(stdout);
  139.         scanf("%ld",&n);
  140.         if (n < 1)
  141.             exit(0);
  142.         klen = (n * 10) / 3;
  143.         result = (int *) malloc(n*sizeof(int));
  144.         chain = (int *) malloc(klen*sizeof(int));
  145.         temp = (int *) malloc(n*sizeof(int));
  146.         if (result == NULL || chain == NULL || temp == NULL)
  147.         {
  148.             printf("no memory, no pi.\n");
  149.             exit(100);
  150.         };
  151.         init_chain();
  152.         timestart = clock();
  153.         drop();
  154.         timeend = clock();
  155.         printf("Zeitbedarf für %ld Stellen: %lds\n",n,
  156.             (timeend-timestart) / CLOCKS_PER_SEC);
  157.         write_result();
  158.         free(result);
  159.         free(chain);
  160.         free(temp);
  161.     };
  162. }
  163.